package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 增强型for循环,JDK1.5之后推出的一个新特性.
 * 可以让我们用相同的语法遍历集合或数组
 * 语法:
 * for(类型 变量名 : 集合或数组){
 *     ...
 * }
 *
 */
public class NewForDemo {
    public static void main(String[] args) {
        //遍历数组
        String[] str = {"1", "2", "3", "4", "5"};
        for (int i = 0; i < str.length; i++) {
            String s = str[i];
            System.out.println(s);
        }
        //新循环遍历数组会被编译器编译成普通for循环
        for (String s1 : str) {
            System.out.println(s1);
        }
        /*
            JDK5之后推出的另一个特性:泛型
            泛型也称为参数化类型,允许我们在使用一个类时,传入某个类型来规定其内部的属性,方法的参数或
            方法返回值的类型,使得我们使用时更加方便.
            在集合中泛型被广泛使用,用于规定集合中的元素类型.

            泛型原型为Object,编译器认可.
            赋值操作时,编译器会检查类型是否匹配.不匹配会编译不通过
            获取泛型的值时,编译器会补充造型操作.
         */
        //遍历集合
        Collection<String> c = new ArrayList();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
//        c.add(123);编译不通过
        Iterator<String> it = c.iterator();
        while (it.hasNext()) {
            //Object obj=it.next();
            //String str1=(String)obj;
            String str1= it.next();
            System.out.println(str1);
        }
        //新循环遍历集合会被编译器改回成迭代器遍历
        /*
            for (Object obj : c) {
                String s = (String) obj;
                System.out.println(s);
        }*/
        for (String s : c) {//集合指定型后，可直接用元素类型接受元素，编译器会补充造型操作
            System.out.println(s);
        }
    }
}
